#!/usr/bin/env node

/**
 * 远程数据库表创建执行脚本
 * 根据配置文件连接远程服务器并执行表创建
 */

const mysql = require('mysql2/promise');
const fs = require('fs');
const path = require('path');

// 数据库配置
const dbConfig = {
    host: '43.143.253.188',
    port: 3306,
    user: 'nextjs',
    password: 'yEAiRE2jcxTyRBy5',
    database: 'nextjs',
    charset: 'utf8mb4',
    multipleStatements: true,
    acquireTimeout: 60000,
    timeout: 60000
};

// SQL文件列表（按执行顺序）
const sqlFiles = [
    '01_create_tables.sql',
    '02_items_equipment_mounts.sql', 
    '03_deputy_faction_chat.sql',
    '04_casino_system.sql',
    '05_other_systems.sql'
];

async function executeRemoteCreation() {
    let connection;
    
    try {
        console.log('🚀 开始连接远程数据库服务器...');
        console.log(`📡 服务器: ${dbConfig.host}:${dbConfig.port}`);
        console.log(`🗄️  数据库: ${dbConfig.database}`);
        console.log(`👤 用户: ${dbConfig.user}`);
        
        // 建立数据库连接
        connection = await mysql.createConnection(dbConfig);
        console.log('✅ 数据库连接成功！');
        
        // 测试连接
        const [rows] = await connection.execute('SELECT 1 as test');
        console.log('✅ 数据库连接测试通过！');
        
        // 获取当前数据库信息
        const [dbInfo] = await connection.execute('SELECT DATABASE() as current_db, VERSION() as version');
        console.log(`📊 当前数据库: ${dbInfo[0].current_db}`);
        console.log(`🔧 MySQL版本: ${dbInfo[0].version}`);
        
        // 检查现有表数量
        const [tables] = await connection.execute(`
            SELECT COUNT(*) as table_count 
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
        `, [dbConfig.database]);
        
        console.log(`📋 当前数据库中的表数量: ${tables[0].table_count}`);
        
        // 询问是否继续
        console.log('\n⚠️  警告: 此操作将创建60个新表，可能会影响现有数据！');
        console.log('📝 建议在执行前备份现有数据。');
        
        // 开始执行SQL文件
        console.log('\n🔄 开始执行表创建脚本...');
        
        let totalTablesCreated = 0;
        let totalErrors = 0;
        
        for (const sqlFile of sqlFiles) {
            const filePath = path.join(__dirname, sqlFile);
            
            if (!fs.existsSync(filePath)) {
                console.log(`❌ 文件不存在: ${sqlFile}`);
                totalErrors++;
                continue;
            }
            
            console.log(`\n📄 正在执行: ${sqlFile}`);
            
            try {
                const sqlContent = fs.readFileSync(filePath, 'utf8');
                
                // 分割SQL语句（按分号分割，但要注意字符串中的分号）
                const statements = sqlContent
                    .split(';')
                    .map(stmt => stmt.trim())
                    .filter(stmt => stmt.length > 0 && !stmt.startsWith('--'));
                
                let fileTablesCreated = 0;
                
                for (const statement of statements) {
                    if (statement.trim()) {
                        try {
                            await connection.execute(statement);
                            
                            // 检查是否是CREATE TABLE语句
                            if (statement.toUpperCase().includes('CREATE TABLE')) {
                                const tableName = statement.match(/CREATE TABLE\s+`?(\w+)`?/i);
                                if (tableName) {
                                    console.log(`  ✅ 创建表: ${tableName[1]}`);
                                    fileTablesCreated++;
                                }
                            }
                        } catch (error) {
                            console.log(`  ⚠️  SQL执行警告: ${error.message}`);
                            // 继续执行其他语句
                        }
                    }
                }
                
                totalTablesCreated += fileTablesCreated;
                console.log(`✅ ${sqlFile} 执行完成，创建了 ${fileTablesCreated} 个表`);
                
            } catch (error) {
                console.log(`❌ 执行 ${sqlFile} 时出错: ${error.message}`);
                totalErrors++;
            }
        }
        
        // 最终统计
        console.log('\n📊 执行结果统计:');
        console.log(`✅ 成功创建表数量: ${totalTablesCreated}`);
        console.log(`❌ 错误数量: ${totalErrors}`);
        
        // 验证最终表数量
        const [finalTables] = await connection.execute(`
            SELECT COUNT(*) as table_count 
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
        `, [dbConfig.database]);
        
        console.log(`📋 最终数据库中的表数量: ${finalTables[0].table_count}`);
        
        // 显示部分创建的表
        const [tableList] = await connection.execute(`
            SELECT table_name 
            FROM information_schema.tables 
            WHERE table_schema = ? AND table_type = 'BASE TABLE'
            ORDER BY table_name
            LIMIT 10
        `, [dbConfig.database]);
        
        console.log('\n📋 部分创建的表:');
        tableList.forEach(table => {
            console.log(`  - ${table.table_name}`);
        });
        
        if (totalTablesCreated > 0) {
            console.log('\n🎉 数据库表创建完成！');
            console.log('💡 建议执行以下操作:');
            console.log('  1. 检查表结构是否正确');
            console.log('  2. 验证外键约束');
            console.log('  3. 测试应用程序连接');
        } else {
            console.log('\n⚠️  没有创建任何新表，请检查SQL文件内容。');
        }
        
    } catch (error) {
        console.error('❌ 执行过程中发生错误:', error.message);
        console.error('🔍 错误详情:', error);
        
        if (error.code === 'ER_ACCESS_DENIED_ERROR') {
            console.log('\n💡 可能的解决方案:');
            console.log('  1. 检查数据库用户名和密码');
            console.log('  2. 确认用户有CREATE TABLE权限');
            console.log('  3. 检查数据库主机和端口');
        } else if (error.code === 'ECONNREFUSED') {
            console.log('\n💡 可能的解决方案:');
            console.log('  1. 检查数据库服务器是否运行');
            console.log('  2. 确认端口3306是否开放');
            console.log('  3. 检查防火墙设置');
        }
    } finally {
        if (connection) {
            await connection.end();
            console.log('\n🔌 数据库连接已关闭');
        }
    }
}

// 执行主函数
if (require.main === module) {
    executeRemoteCreation().catch(console.error);
}

module.exports = { executeRemoteCreation, dbConfig };










